import { createStore } from 'vuex';
import config from '@/utils/app-config';
import persistenceStateKeys from './persistence';
import global from './modules/global';

// 保存变量到本地存储中（vuex持久化）
const saveLifeData = function (key, value) {
	// 判断变量名是否在需要存储的数组中
	if (persistenceStateKeys.indexOf(key) !== -1) {
		// 获取vuex 持久化对象
		let vuex_storage = uni.getStorageSync(config.VUEX_STORAGE_NAME);
		// 第一次打开APP，不存在vuex 持久化对象，故放一个{}空对象
		vuex_storage = vuex_storage ? vuex_storage : {};
		// 将变量添加到对象中
		vuex_storage[key] = value;
		// 执行这一步后，所有需要存储的变量，都挂载在本地的 vuex 持久化对象中
		uni.setStorageSync(config.VUEX_STORAGE_NAME, vuex_storage);
	}
};

const store = createStore({
	mutations: {
		// 修改 vuex 中各个模块中的 state，并且进行持久化
		setVuexStorage(state, payload) {
			const store_state = state[payload.state];
			const key_arr = payload.key.split('.');
			let save_key = '';
			let name_arr_len = key_arr.length;
			// 判断是否多层级调用，state中为对象存在的情况，诸如user.info.score = 1
			if (name_arr_len >= 2) {
				// 多层级处理
				try {
					let state_obj = store_state[key_arr[0]];
					for (let i = 1; i < name_arr_len - 1; i++) {
						state_obj = state_obj[key_arr[i]];
					}
					state_obj[key_arr[name_arr_len - 1]] = payload.value;
				} catch (e) {
					console.error('vuex赋值失败：', payload, '\n', e);
				}
				save_key = key_arr[0];
			} else {
				// 单层级处理，在state就是一个普通变量的情况
				save_key = payload.key;
				store_state[save_key] = payload.value;
			}
			// 保存变量到本地，见顶部函数定义
			saveLifeData(save_key, store_state[save_key]);
		}
	},
	modules: {
		global
	}
});

export default store;
